package w.z.x.framework.repository.interfaces;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;

/**
 * 比较条件
 *
 * @author 魏祖潇
 */
public interface Compare<Child, R> extends Serializable {

    /**
     * 等于
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child eq(boolean condition, R r, Object value);

    /**
     * 等于
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child eq(R r, Object value) {
        return eq(true, r, value);
    }

    /**
     * 不等于
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child ne(boolean condition, R r, Object value);

    /**
     * 不等于
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child ne(R r, Object value) {
        return ne(true, r, value);
    }

    /**
     * 大于
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child gt(boolean condition, R r, Object value);

    /**
     * 大于
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child gt(R r, Object value) {
        return gt(true, r, value);
    }

    /**
     * 小于
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child lt(boolean condition, R r, Object value);

    /**
     * 小于
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child lt(R r, Object value) {
        return lt(true, r, value);
    }

    /**
     * 大等于
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child ge(boolean condition, R r, Object value);

    /**
     * 大等于
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child ge(R r, Object value) {
        return ge(true, r, value);
    }

    /**
     * 小等于
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child le(boolean condition, R r, Object value);

    /**
     * 小等于
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child le(R r, Object value) {
        return le(true, r, value);
    }

    /**
     * 匹配
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child like(boolean condition, R r, Object value);

    /**
     * 模糊匹配
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child like(R r, Object value) {
        return like(true, r, value);
    }

    /**
     * 不匹配
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param value     值
     * @return Wrapper
     */
    Child notLike(boolean condition, R r, Object value);

    /**
     * 不匹配
     *
     * @param r     字段
     * @param value 值
     * @return Wrapper
     */
    default Child notLike(R r, Object value) {
        return notLike(true, r, value);
    }

    /**
     * 在集合内
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param values    值
     * @return Wrapper
     */
    Child in(boolean condition, R r, Collection<?> values);

    /**
     * 在集合内
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param values    值
     * @return Wrapper
     */
    default Child in(boolean condition, R r, Object... values) {
        return in(condition, r, Arrays.asList(values));
    }

    /**
     * 在集合内
     *
     * @param r      字段
     * @param values 值
     * @return Wrapper
     */
    default Child in(R r, Collection<?> values) {
        return in(true, r, values);
    }

    /**
     * 在集合内
     *
     * @param r      字段
     * @param values 值
     * @return Wrapper
     */
    default Child in(R r, Object... values) {
        return in(true, r, Arrays.asList(values));
    }

    /**
     * 非集合内
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param values    值
     * @return Wrapper
     */
    Child notIn(boolean condition, R r, Collection<?> values);

    /**
     * 非集合内
     *
     * @param condition 是否拼接
     * @param r         字段
     * @param values    值
     * @return Wrapper
     */
    default Child notIn(boolean condition, R r, Object... values) {
        return notIn(condition, r, Arrays.asList(values));
    }

    /**
     * 非集合内
     *
     * @param r      字段
     * @param values 值
     * @return Wrapper
     */
    default Child notIn(R r, Collection<?> values) {
        return notIn(true, r, values);
    }

    /**
     * 非集合内
     *
     * @param r      字段
     * @param values 值
     * @return Wrapper
     */
    default Child notIn(R r, Object... values) {
        return notIn(true, r, Arrays.asList(values));
    }

    /**
     * null
     *
     * @param r 字段
     * @return Wrapper
     */
    default Child isNull(R r) {
        return isNull(true, r);
    }

    /**
     * null
     *
     * @param condition 是否拼接
     * @param r         字段
     * @return Wrapper
     */
    Child isNull(boolean condition, R r);

    /**
     * not null
     *
     * @param r 字段
     * @return Wrapper
     */
    default Child notNull(R r) {
        return notNull(true, r);
    }

    /**
     * not null
     *
     * @param condition 是否拼接
     * @param r         字段
     * @return Wrapper
     */
    Child notNull(boolean condition, R r);

}
